package com.bood.shimmer.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * MyBatis Plus Generator
 *
 * @author：bood
 * @since：2020/1/25
 */
public class CodeGenerator {

    /**
     * Database url
     */
    private static String url;
    /**
     * Database driver class
     */
    private static String driverClass;
    /**
     * Database username
     */
    private static String username;
    /**
     * Database password
     */
    private static String password;

    /**
     * 作者信息
     */
    private static String author;
    /**
     * 去除表前缀
     */
    private static String[] setTablePrefix;
    /**
     * 生成的表
     */
    private static String[] tableNames;

    /**
     * 包配置
     */
    private static String setParent;
    private static String setModuleName;
    private static String setController;
    private static String setService;
    private static String setServiceImpl;
    private static String setMapper;
    private static String setXml;
    private static String setEntity;

    // 当前项目的绝对路径
    private static String dirPath = System.getProperty("user.dir");


    /**
     * Init database information
     */
    static {
        Properties properties = new Properties();
        InputStream inputStream = CodeGenerator.class.getResourceAsStream("/generator-config.properties");
        try {
            properties.load(inputStream);
            url = properties.getProperty("generator.jdbc.url").trim();
            driverClass = properties.getProperty("generator.jdbc.driverClass").trim();
            username = properties.getProperty("generator.jdbc.username").trim();
            password = properties.getProperty("generator.jdbc.password").trim();

            author = properties.getProperty("author").trim();
            setTablePrefix = properties.getProperty("setTablePrefix").trim().concat(",").split(",");
            tableNames = properties.getProperty("tableNames").trim().concat(",").split(",");

            setParent = properties.getProperty("setParent").trim();
            setModuleName = properties.getProperty("setModuleName").trim();
            setController = properties.getProperty("setController").trim();
            setService = properties.getProperty("setService").trim();
            setServiceImpl = properties.getProperty("setServiceImpl").trim();
            setMapper = properties.getProperty("setMapper").trim();
            setXml = properties.getProperty("setXml").trim();
            setEntity = properties.getProperty("setEntity").trim();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 将会在 dirPath 路径下生成相关文件
     *
     * @author：boob
     * @create：2020/1/25
     */
    public static void main(String[] args) {
        AutoGenerator generator = new AutoGenerator();

        // 全局策略配置
        GlobalConfig gc = new GlobalConfig();
        // 生成文件的输出目录
        gc.setOutputDir(dirPath + "\\src\\main\\java");
        // 开发人员名称
        gc.setAuthor(author);
        // 是否覆盖已有文件
        gc.setFileOverride(true);
        // 是否打开输出目录
        gc.setOpen(false);
        // 是否在 xml 中添加二级缓存配置
        gc.setEnableCache(false);
        // 不需要 ActiveRecord 特性的请改为 false
        gc.setActiveRecord(true);
        // 实体属性 Swagger2 注解
        gc.setSwagger2(true);
        // XML ResultMap
        gc.setBaseResultMap(true);
        // XML columList
        gc.setBaseColumnList(true);
        // 主键生成策略：AUTO(0)：“数据库自增“，NONE(1)：”（如果没有主键策略）默认根据雪花算法生成”，INPUT(2)：“用户输入ID”，ID_WORKER(3)：“全局唯一”，UUID(4)：“全局唯一（UUID）”，ID_WORKER_STR(5)：”全局唯一“
        gc.setIdType(IdType.ID_WORKER_STR);

        // 自定义文件命名，注意 %s 会自动填充表实体属性！
        gc.setControllerName("%sController");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        generator.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setUrl(url);
        dsc.setDriverName(driverClass);
        dsc.setUsername(username);
        dsc.setPassword(password);

        dsc.setTypeConvert(new MySqlTypeConvert() {
            @Override
            public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                // tinyint转换成INTEGER
                if (fieldType.toLowerCase().contains("tinyint")) {
                    return DbColumnType.INTEGER;
                }
                //将数据库中datetime转换成date
                if (fieldType.toLowerCase().contains("datetime")) {
                    return DbColumnType.LOCAL_DATE_TIME;
                }
                return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
            }

        });
        generator.setDataSource(dsc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 全局大写命名 ORACLE 注意
        // strategy.setCapitalMode(true);
        // 此处可以修改为您的表前缀
        strategy.setTablePrefix(setTablePrefix);
        // 表名生成策略
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 需要生成的表
        strategy.setInclude(tableNames);

        // 排除生成的表
        // strategy.setExclude(new String[]{"Test"});
        // 自定义实体父类
        // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");
        // 自定义实体，公共字段
        // strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
        // 自定义 mapper 父类
        // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
        // 自定义 service 父类
        // strategy.setSuperServiceClass("com.baomidou.demo.TestService");
        // 自定义 service 实现类父类
        // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
        // 自定义 controller 父类
        // strategy.setSuperControllerClass("com.baomidou.demo.TestController");
        // 【实体】是否生成字段常量（默认 false）
        // public static final String ID = "test_id";
        // strategy.setEntityColumnConstant(true);
        // 【实体】是否为构建者模型（默认 false）
        // public User setName(String name) {this.name = name; return this;}
        strategy.setEntityBuilderModel(true);
        // 【实体】是否为lombok模型（默认 false）
        strategy.setEntityLombokModel(false);
        // Boolean类型字段是否移除is前缀处理
        strategy.setEntityBooleanColumnRemoveIsPrefix(true);
        // 生成 @RestController 控制器
        strategy.setRestControllerStyle(true);
        generator.setStrategy(strategy);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(setParent);
        pc.setModuleName(setModuleName);
        pc.setController(setController);
        pc.setService(setService);
        pc.setServiceImpl(setServiceImpl);
        pc.setMapper(setMapper);
        pc.setXml(setXml);
        pc.setEntity(setEntity);

        generator.setPackageInfo(pc);
        // 执行生成
        generator.execute();
    }

}